#!/usr/bin/env python3
"""
QnBt 快速启动脚本
使用 UV 包管理器自动化项目环境设置
"""

import os
import sys
import subprocess
import platform
from pathlib import Path

def print_banner():
    """打印欢迎横幅"""
    banner = """
    ╔══════════════════════════════════════════════╗
    ║            🏠 QnBt 宝塔主机面板              ║
    ║          🚀 UV 包管理器快速启动脚本          ║
    ╚══════════════════════════════════════════════╝
    """
    print(banner)

def check_python_version():
    """检查 Python 版本"""
    print("🐍 检查 Python 版本...")
    version = sys.version_info
    if version < (3, 10, 2):
        print(f"❌ Python 版本过低: {version.major}.{version.minor}.{version.micro}")
        print("   需要 Python 3.10.2 或更高版本")
        return False
    
    print(f"✅ Python 版本: {version.major}.{version.minor}.{version.micro}")
    return True

def check_uv_installed():
    """检查 UV 是否已安装"""
    print("📦 检查 UV 包管理器...")
    try:
        result = subprocess.run(['uv', '--version'], 
                              capture_output=True, text=True, check=True)
        print(f"✅ UV 已安装: {result.stdout.strip()}")
        return True
    except (subprocess.CalledProcessError, FileNotFoundError):
        print("❌ UV 未安装")
        return False

def install_uv():
    """安装 UV 包管理器"""
    print("🔧 正在安装 UV...")
    system = platform.system().lower()
    
    # 定义多个安装方法
    install_methods = []
    
    if system == "windows":
        install_methods = [
            ('powershell -c "irm https://astral.sh/uv/install.ps1 | iex"', "官方安装脚本"),
            ('pip install uv', "使用 pip 安装")
        ]
    else:
        install_methods = [
            ('curl -LsSf https://astral.sh/uv/install.sh | sh', "官方安装脚本"),
            ('pip install -i https://pypi.douban.com/simple/ uv', "豆瓣镜像 + pip"),
            ('pip install -i https://pypi.tuna.tsinghua.edu.cn/simple/ uv', "清华镜像 + pip"),
            ('pip install -i https://mirrors.aliyun.com/pypi/simple/ uv', "阿里云镜像 + pip"),
            ('pip install uv', "默认 pip 安装")
        ]
    
    # 尝试每种安装方法
    for cmd, description in install_methods:
        try:
            print(f"   尝试: {description}")
            subprocess.run(cmd, shell=True, check=True, timeout=300)
            print("✅ UV 安装完成")
            return True
        except (subprocess.CalledProcessError, subprocess.TimeoutExpired) as e:
            print(f"   ❌ {description} 失败: {e}")
            continue
    
    print("❌ 所有安装方法都失败了")
    print("   请尝试以下手动安装方法:")
    print("   1. 使用系统包管理器: sudo apt install python3-pip && pip3 install uv")
    print("   2. 下载二进制文件: https://github.com/astral-sh/uv/releases/latest")
    print("   3. 配置网络代理后重试")
    return False

def setup_project():
    """设置项目环境"""
    print("🏗️  正在设置项目环境...")
    
    try:
        # 创建虚拟环境
        print("   创建虚拟环境...")
        subprocess.run(['uv', 'venv'], check=True)
        
        # 同步依赖
        print("   同步项目依赖...")
        subprocess.run(['uv', 'sync'], check=True)
        
        print("✅ 项目环境设置完成")
        return True
    except subprocess.CalledProcessError as e:
        print(f"❌ 项目环境设置失败: {e}")
        return False

def print_usage_instructions():
    """打印使用说明"""
    system = platform.system().lower()
    venv_activate = ".venv\\Scripts\\activate" if system == "windows" else "source .venv/bin/activate"
    
    instructions = f"""
    
    🎉 环境设置完成！接下来的步骤：
    
    1️⃣  激活虚拟环境：
       {venv_activate}
    
    2️⃣  启动应用：
       uv run python app.py
       # 或在激活的虚拟环境中：
       python app.py
    
    3️⃣  访问应用：
       http://localhost:5000
    
    📚 更多 UV 命令：
       uv add <package>     # 添加新包
       uv remove <package>  # 移除包
       uv sync              # 同步依赖
       uv sync --dev        # 包含开发依赖
       uv run <command>     # 在虚拟环境中运行命令
    
    🔗 更多信息请查看 README.md 或访问：
       https://gitee.com/zhuxiaohuaqn/qnbt
    """
    print(instructions)

def main():
    """主函数"""
    print_banner()
    
    # 检查 Python 版本
    if not check_python_version():
        sys.exit(1)
    
    # 检查 UV 是否安装
    if not check_uv_installed():
        print("🤔 是否要自动安装 UV？(y/N): ", end="")
        choice = input().lower().strip()
        
        if choice in ['y', 'yes']:
            if not install_uv():
                sys.exit(1)
        else:
            print("📝 请手动安装 UV:")
            print("   Windows: powershell -c \"irm https://astral.sh/uv/install.ps1 | iex\"")
            print("   macOS/Linux: curl -LsSf https://astral.sh/uv/install.sh | sh")
            print("   或使用 pip: pip install uv")
            sys.exit(1)
    
    # 设置项目环境
    if not setup_project():
        sys.exit(1)
    
    # 打印使用说明
    print_usage_instructions()

if __name__ == "__main__":
    main()